// package com.lovar.gaming.core.page;
//
// import cn.hutool.core.collection.CollUtil;
// import cn.hutool.core.util.ObjectUtil;
// import cn.hutool.core.util.StrUtil;
// import com.baomidou.mybatisplus.core.metadata.OrderItem;
// import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
// import lombok.Data;
//
// import java.io.Serializable;
// import java.util.ArrayList;
// import java.util.List;
//
// /**
//  * 分页查询实体类
//  *
//  * @author chenwl
//  * @date 2024/4/21 周日
//  */
// @Data
// public class PageQuery implements Serializable {
//     /**
//      * 分页大小
//      */
//     private Integer pageSize;
//
//     /**
//      * 当前页数
//      */
//     private Integer pageNum;
//
//     /**
//      * 排序列
//      */
//     private String orderByColumn;
//
//     /**
//      * 排序的方向desc或者asc
//      */
//     private String isAsc;
//
//     /**
//      * 当前记录起始索引 默认值
//      */
//     public static final int DEFAULT_PAGE_NUM = 1;
//
//     /**
//      * 每页显示记录数 默认值 默认查全部
//      */
//     public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE;
//
//     public <T> Page<T> build() {
//         Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM);
//         Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE);
//         if (pageNum <= 0) {
//             pageNum = DEFAULT_PAGE_NUM;
//         }
//         Page<T> page = new Page<>(pageNum, pageSize);
//         List<OrderItem> orderItems = buildOrderItem();
//         if (CollUtil.isNotEmpty(orderItems)) {
//             page.addOrder(orderItems);
//         }
//         return page;
//     }
//
//     /**
//      * 构建排序
//      * 支持的用法如下:
//      * {isAsc:"asc",orderByColumn:"id"} order by id asc
//      * {isAsc:"asc",orderByColumn:"id,createTime"} order by id asc,create_time asc
//      * {isAsc:"desc",orderByColumn:"id,createTime"} order by id desc,create_time desc
//      * {isAsc:"asc,desc",orderByColumn:"id,createTime"} order by id asc,create_time desc
//      */
//     private List<OrderItem> buildOrderItem() {
//         if (StrUtil.isEmpty(orderByColumn) || StrUtil.isEmpty(isAsc)) {
//             return null;
//         }
//         String orderBy = this.escapeOrderBySql(orderByColumn);
//         orderBy = StrUtil.toUnderlineCase(orderBy);
//
//         // 兼容前端排序类型
//         isAsc = StrUtil.replace(isAsc, "ascending", "asc");
//         isAsc = StrUtil.replace(isAsc, "descending", "desc");
//
//         String[] orderByArr = orderBy.split(",");
//         String[] isAscArr = isAsc.split(",");
//         if (isAscArr.length != 1 && isAscArr.length != orderByArr.length) {
//             throw new RuntimeException("排序参数有误");
//         }
//
//         List<OrderItem> list = new ArrayList<>();
//         // 每个字段各自排序
//         for (int i = 0; i < orderByArr.length; i++) {
//             String orderByStr = orderByArr[i];
//             String isAscStr = isAscArr.length == 1 ? isAscArr[0] : isAscArr[i];
//             if ("asc".equals(isAscStr)) {
//                 list.add(OrderItem.asc(orderByStr));
//             } else if ("desc".equals(isAscStr)) {
//                 list.add(OrderItem.desc(orderByStr));
//             } else {
//                 throw new RuntimeException("排序参数有误");
//             }
//         }
//         return list;
//     }
//
//
//     private String escapeOrderBySql(String value) {
//         // 仅支持字母、数字、下划线、空格、逗号、小数点（支持多个字段排序）
//         String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";
//         if (StrUtil.isNotEmpty(value) && !value.matches(SQL_PATTERN)) {
//             throw new IllegalArgumentException("参数不符合规范，不能进行查询");
//         }
//         return value;
//     }
//
// }
